/*----------------------------------------------------------------------------*\
|
|						Public Interface to Muse Technology
|
|							     www.Muse.com
| Author : SunJun 
| Email : sundoom@msn.com
\*----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////
// $Id: VertexFormat.h,v 1.2 2009/04/03 12:51:25 sunjun Exp $
//////////////////////////////////////////////////////////////////////////

#ifndef __VertexFormat__
#define __VertexFormat__

//////////////////////////////////////////////////////////////////////////

#if defined __cplusplus

//////////////////////////////////////////////////////////////////////////

#include <Context.h>

//////////////////////////////////////////////////////////////////////////

NAMESPACE_BEGIN

//////////////////////////////////////////////////////////////////////////

	// this class provides an object-oriented vertex format interface.
	class API VertexFormat : public MReference
	{
	public:
		#pragma pack(push,1)
		// vertex element semantics
		enum SEMANTIC 
		{
			VES_POSITION		= 0,
			VES_BLENDWEIGHT		= 1,
			VES_BLENDINDICES	= 2,
			VES_NORMAL			= 3,
			VES_PSIZE			= 4,
			VES_TEXCOORD		= 5,
			VES_TANGENT			= 6,
			VES_BINORMAL		= 7,
			VES_TESSFACTOR		= 8,
			VES_POSITIONT		= 9,
			VES_COLOR			= 10,
			VES_FOG				= 11,
			VES_DEPTH			= 12,
			VES_SAMPLE			= 13
		};

		/// vertex element type
		enum TYPE
		{
			VET_FLOAT1		=  0,
			VET_FLOAT2		=  1,
			VET_FLOAT3		=  2,
			VET_FLOAT4		=  3,
			VET_COLOR		=  4,
			VET_UBYTE4		=  5,
			VET_SHORT2		=  6,
			VET_SHORT4		=  7,
			VET_UBYTE4N		=  8,
			VET_SHORT2N		=  9,
			VET_SHORT4N		= 10,
			VET_USHORT2N	= 11,
			VET_USHORT4N	= 12,
		};

		struct FORMAT 
		{
			U16	stream;
			U16	offset;
			U8	type;
			U8	semantic;
		};
		#pragma pack(pop)

	public:
		// constructor
		VertexFormat( const Context* rc );
		
		// destructor
		virtual ~VertexFormat();

		// get the handle
		INLINE HANDLE handle() const;

		// load the data
		INLINE VOID load( const FORMAT* formats );
		
	private:
		ContextPtr mRCPtr;
		HANDLE mHandle;

	private: friend class Primitive;
	};	

	typedef MPtr<VertexFormat>VertexFormatPtr;

//////////////////////////////////////////////////////////////////////////

NAMESPACE_END

//////////////////////////////////////////////////////////////////////////

#endif // __cplusplus

//////////////////////////////////////////////////////////////////////////

#endif // __VertexFormat__

//////////////////////////////////////////////////////////////////////////